SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [dbo].[paChequearBajasDeServicios]
-- <DESCRIPCION> Realiza el chequeo de baja de un servicio.
-- <CONSIDERACIONES ESPECIALES> 
-- <TABLAS> tb_ServiciosAgentes, tb_SubServiciosAgentes, tb_ColaDeMovimientos, tb_PlazasDeMovimiento
-- <ACTUALIZACIONES> 09 - 05 - 2006 por OTERO, Javier (se agrega el control de evaluacion de la antiguedad o posterioridad del movimiento)
-- <ACTUALIZACIONES> 10 - 05 - 2006 por SANES, Jorge (Se cambio Orden de Controles por Error Retornado)
-- <ACTUALIZACIONES> 23 - 05 - 2006 por SANES, Jorge (Se cambio Mensaje de Aviso cuando la Fecha de Baja es menor a la Fecha de Alta del Ultimo Subservicio)
-- <ACTUALIZACIONES> 24 - 06 - 2006 por OTERO, Javier (Se agrega control para no permitir bajar un servicio Extra Sistema de una LE.)
-- <ACTUALIZACIONES> 06 - 05 - 2008 por OTERO, Marcelo y SANES, Jorge (Se cambio la forma de realizar el control, ya que para una cola de movimiento pueden existir varias plazas a bajar)
-- <ACTUALIZACIONES> 10 - 06 - 2009 por OTERO, Marcelo y SANES, Jorge (Controla que si tiene un servicio relacionado que posee subservicios, la fecha de alta del ultimo subservicio abierto debe ser menor a la fecha de baja del servicio base que se intenta dar de baja)
-- <ACTUALIZACIONES> 10 - 03 - 2010 por OTERO, Marcelo y SANES, Jorge (Controla que todos los servicios seleccionados para bajar tengan la misma SR)
-- <ACTUALIZACIONES> 23 - 03 - 2010 por OTERO, Marcelo y SANES, Jorge (Nuevos controles para Bajas por Transferencia)


---- ACTUALIZADO EN DB
-- 17/07/2006 - SANES, Jorge 
-- 06/05/2008 - SANES, Jorge


@idCola INT,
@Estado INT OUTPUT,
@Diagnostico VARCHAR(1000) OUTPUT
AS
SET NOCOUNT ON
-- Almacena el codigo de plaza.
DECLARE @idPlaza INT
-- Almacena el Ultimo Subservicio del servicio que se va a bajar
DECLARE @SubServicio INT
-- Almacena la Fecha de Alta del ultimo Subservicio
DECLARE @FechaAlta DATETIME
-- Almacena la Fecha de Baja de la Cola de Movimientos
DECLARE @FechaBaja DATETIME
-- Almacena la plaza destino cuando es baja por Disponibilidad
DECLARE @PlazaDisponibilidad INT
--declare @Estado int
DECLARE @CausaBaja INT
-- Para almacenar el modo del usuario.
DECLARE @Modo INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasAnterioresBaja INT
-- Para evaluar la antiguedad o posterioridad del movimiento
DECLARE @DiasPosterioresBaja INT
-- Para almacenar el Id de Servicio
DECLARE @IdServicio INT
-- Para almacenar el Id de la Plaza de Movimientos
DECLARE @IdPlazaMovimiento INT
--
DECLARE @Error INT 
--
DECLARE @ContadorRegistros INT 
--
DECLARE @ServicioARelacionar INT 
DECLARE @Agente INT 
DECLARE @CargoSalarial INT


SELECT @Modo = Modo FROM tb_Usuarios WHERE NTUser = SYSTEM_USER


SELECT @FechaBaja = Fecha2, @Agente = Agente, @CargoSalarial = CargoSalarial FROM tb_ColaDeMovimientos WHERE idCola = @idCola


SELECT @DiasPosterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaPosterior'
SELECT @DiasAnterioresBaja = CONVERT(INT, Valor1) FROM tb_Parametros WHERE Parametro = 'DiasDeDiferenciaParaFechasDeBajaAnteriores'


SELECT @Diagnostico = ' '
SELECT @Error = 0
SELECT @ContadorRegistros = 1

/*if (SELECT DISTINCT count(s.SituacionRevista) FROM tb_ColaDeMovimientos c INNER JOIN tb_PlazasDeMovimiento p ON p.idCola=c.idCola 
   	INNER JOIN tb_ServiciosAgentes s ON s.idServicioAgente=p.IdServicioBase WHERE c.idCola=@idcola) >1
         BEGIN
		SELECT @Error = 3, @Diagnostico = @Diagnostico+'*'+ 'Error! No pueden seleccionar Servicios que tengan DISTINTA SITUACION DE REVISTA.-'
 		--se actualiza el estado en CHECK OK
		UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
		GOTO Salir2
	
         END

*/
DECLARE @MISMAST INT

DECLARE xPlazas CURSOR forward_only FOR SELECT idPlaza, Servicio, PlazaDestino, CausaBaja, IdPlazasDeMovimientos, IdServicioRelacionado FROM tb_PlazasDeMovimiento WHERE idCola = @idCola
OPEN xPlazas
FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio, @PlazaDisponibilidad, @CausaBaja, @IdPlazaMovimiento, @ServicioARelacionar

	WHILE @@FETCH_STATUS = 0
	  BEGIN

		SELECT @FechaAlta = FechaAlta, @IdServicio = ServicioAgente from tb_SubServiciosAgentes WHERE idSubServicio = @SubServicio

		--Controlo que los servicios seleccionados tengan la misma SR
		if (@ContadorRegistros=1)
			SET @MISMAST = (select situacionrevista FROM TB_SERVICIOSAGENTES WHERE IDSERVICIOAGENTE=@IdServicio)
		ELSE
			IF @MISMAST <> (select situacionrevista FROM TB_SERVICIOSAGENTES WHERE IDSERVICIOAGENTE=@IdServicio)
				BEGIN
					SELECT @Error = 3, @Diagnostico = @Diagnostico+'*'+ 'Error! No se pueden seleccionar Servicios que tengan DISTINTA Situacion de Revista.-'
 					UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
					GOTO Salir
				END
		
		
		-- Control I
		-- Controla que no se pueda bajar un Servicio Extra Sistema de una Licencia Extraordinaria (Agregado el 25-06-2006)
		IF EXISTS(SELECT top 1 IdServicio2 FROM tb_RelInterServicios R 
			INNER JOIN tb_ServiciosAgentes S ON S.IdServicioAgente = R.IdServicio2
			INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
			INNER JOIN tb_ServiciosAgentes SE ON SE.IdServicioAgente = R.IdServicio
			INNER JOIN tb_SubServiciosAgentes SSE ON SSE.ServicioAgente = SE.IdServicioAgente
			WHERE R.IdServicio = @IdServicio
			AND TipoRelacion = 8
			AND SS.FechaBaja IS NULL
			AND SS.SituacionLaboral = 1
			AND SSE.SituacionExtraordinaria <> 5) -- Que la situacion extraodrinaria del extrasistema NO SEA  NORMAL.
		BEGIN
			SELECT @Error = 3, @Diagnostico = @Diagnostico+'*'+ 'Error! No se puede bajar un servicio Extra Sistema. Para hacerlo debe dar de baja la LE.'+' ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
 			--se actualiza el estado en CHECK OK
			UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
			GOTO Salir 
		END


		-- Control I Bis   --- 09-03-2009 ----- RE-TOMADO el 10-06-2009 a penas 3 meses despues
		-- Controla que si tiene un servicio relacionado que posee subservicios, la fecha de alta del ultimo subservicio abierto debe ser menor a la fecha de baja del servicio base que se intenta dar de baja
		IF EXISTS(SELECT top 1 IdServicio2 FROM tb_RelInterServicios R 
			INNER JOIN tb_ServiciosAgentes S ON S.IdServicioAgente = R.IdServicio2
			INNER JOIN tb_SubServiciosAgentes SS ON S.IdServicioAgente = SS.ServicioAgente
			INNER JOIN tb_ServiciosAgentes SE ON SE.IdServicioAgente = R.IdServicio
			INNER JOIN tb_SubServiciosAgentes SSE ON SSE.ServicioAgente = SE.IdServicioAgente
			WHERE R.IdServicio2 = @IdServicio
			AND TipoRelacion = 8
			AND SSE.FechaBaja IS NULL
			AND SSE.FechaAlta > @FechaBaja)


		BEGIN
			SELECT @Error = 3, @Diagnostico = @Diagnostico+'*'+ 'Error! No puede Bajar el Servicio, este posee un servicio Extra Sistema con Subservicios que tienen fecha posterior a la Fecha de Baja que se intenta dar . '+' ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
 			--se actualiza el estado en CHECK OK
			UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
			GOTO Salir 
		END		

	
		-- Control II
		IF @PlazaDisponibilidad IS NULL AND @CausaBaja = 8
		BEGIN
		  SELECT @Error = 3, @Diagnostico= @Diagnostico+'*'+'Cuando la causa de baja es PASE A DISPONIBILIDAD debe seleccioar una PLAZA DESTINO con division = N'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
 		  --se actualiza el estado en CHECK OK
 		  UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
		  GOTO Salir
		END

		-- Control III
		IF @FechaBaja <= @FechaAlta 
		BEGIN
		 SELECT @Error = 3, @Diagnostico = @Diagnostico+'*'+'La Fecha de Baja es inferior a la Fecha de Alta del Ultimo SubServicio!'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
 		 --se actualiza el estado en CHECK OK
 		 UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
		 GOTO Salir 
		END
		
		-- Control IV
		IF @PlazaDisponibilidad is not null and @CausaBaja = 8 and ltrim(rtrim((Select d.division from tb_Divisiones d, tb_Plazas p where idDivision = p.division and idPlaza = @PlazaDisponibilidad))) <> 'N'
		BEGIN
		   SELECT @Error = 3, @Diagnostico=@Diagnostico+'*'+'La Division de la Plaza Destino debe tener division = N.  Si no existe la plaza deberia crearla'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'	
 		   --se actualiza el estado en CHECK OK
 		   UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
		   GOTO Salir 
		END
		
		-- Control V
		IF EXISTS(SELECT top 1 S.FechaBaja FROM tb_ServiciosAgentes S INNER JOIN tb_SubServiciosAgentes SS ON idServicioagente = ServicioAgente WHERE idSubServicio = @SubServicio AND S.FechaBaja IS NOT NULL)
		BEGIN
		    SELECT @Error =3, @Diagnostico=@Diagnostico+'*'+'El Servicio ya se encuentra dado de baja'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
 		    --se actualiza el estado en CHECK OK
 		    UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
		    GOTO Salir 
		END
		
		---------------------- CONTROL AGREGADO 23-03-2010 PARA RELACION EL SERVICIO A BAJAR CON UN ALTA POR TRANSFERENCIA ---------------------

		IF @CausaBaja = 7 
			IF  (@ServicioARelacionar IS NULL OR @ServicioARelacionar < 0) --Si es Baja por TRANSFERENCIA y no se especifico un Servicio a RELACIONAR
					BEGIN
						SELECT @Error = 3, @Diagnostico = @Diagnostico + '*'+'Cuando se especifica BAJA POR TRANSFERENCIA debe seleccionar el Servicio a Relacionar'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'	
				 		UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
						GOTO Salir	
					END 
			    ELSE
					BEGIN
					    	-- Ver que el servicio a Bajar sea de la misma persona
						IF  @Agente <> (SELECT Agente FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar)
						  BEGIN
							SELECT @Error = 3, @Diagnostico = @Diagnostico + '*'+'El Servicio relacionado debe pertenecer al mismo Agente.-'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'		
							UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento	
							GOTO Salir
						  END 
			
			
						-- Controlar Regimen Salarial en ambos servicios
						IF  (SELECT Regimensalarial FROM tb_CargosSalariales WHERE idCargo = @CargoSalarial) <> (SELECT RegimenSalarial FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar)
						  BEGIN
							SELECT @Error = 3, @Diagnostico = @Diagnostico + '*'+'El Regimen Salarial debe ser el mismo para el Nuevo Servicio y el Relacionado'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'		
							UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
							GOTO Salir
						  END 
			
						-- Ver que el Servicio a relacionar tenga causa de alta Designacion por Transferencia (8)
						IF (SELECT CausaAlta FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioARelacionar) <> 8 
						  BEGIN
							SELECT @Error = 3, @Diagnostico = @Diagnostico + '*'+'La Causa de Alta del Servicio a relacionar no es Designación por Transferencia'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'		
							UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
							GOTO Salir
						  END 
						
						-- Ver que la Fecha de Baja ingresada sea igual a la Fecha de Alta del servicio seleccionado a relacionar
											
						DECLARE @FechaAltaSerRel DATETIME 
	
						SELECT @FechaAltaSerRel = FechaAlta FROM Tb_ServiciosAgentes WHERE  idServicioAgente = @ServicioARelacionar 
						
						IF @FechaBaja <> @FechaAltaSerRel
							BEGIN
								SELECT @Error = 3, @Diagnostico = @Diagnostico + '*'+'El Servicio seleccionado tiene una Fecha de Alta distinta a la Fecha de Baja ingresada. Verifique el Servicio seleccionado.- '+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'		
								UPDATE tb_PlazasDeMovimiento SET Estado = @Error WHERE idCola = @idCola AND idplazasdemovimientos = @IdPlazaMovimiento
								GOTO Salir
							END 
	
					END

		--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------	

		-- Control VI
		-- Control que el movimiento no este alejado del dia de la fecha.
		IF  @FechaBaja < GETDATE() AND (DATEDIFF(DAY, @FechaBaja, GETDATE())+1) > @DiasAnterioresBaja
			SELECT @Error = 1, @Diagnostico = @Diagnostico+'*'+'Error! La fecha de baja exede la cantidad de dias permitidos anteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'
		ELSE
			IF @FechaBaja IS NOT NULL AND @FechaBaja > GETDATE() AND (DATEDIFF(DAY, GETDATE(), @FechaBaja)+1) > @DiasPosterioresBaja
				SELECT @Error = 1, @Diagnostico = @Diagnostico+'*'+'Error! La fecha de baja exede la cantidad de dias permitidos posteriores a la fecha de hoy (tiene mas de '+CONVERT(VARCHAR, @DiasAnterioresBaja)+' dias de diferencia).'+'*'+'ERROR en Registro Nº '+CONVERT(VARCHAR, @ContadorRegistros)+' seleccionado.-'


		SET @ContadorRegistros = @ContadorRegistros + 1		
		
		FETCH NEXT FROM xPlazas INTO @idPlaza, @SubServicio, @PlazaDisponibilidad, @CausaBaja, @IdPlazaMovimiento, @ServicioARelacionar
		
	  END


SALIR:

CLOSE xPlazas
DEALLOCATE xPlazas


UPDATE tb_ColaDeMovimientos SET Estado = @Error, estadocheck = @error,
	ChequeoEscuela = CASE WHEN @Modo = 2 THEN @Diagnostico ELSE ChequeoEscuela END
 WHERE idCola = @idCola

SET @Estado = @Error
GO
GRANT EXECUTE ON  [dbo].[paChequearBajasDeServicios] TO [CentroDeDesignaciones]
GRANT EXECUTE ON  [dbo].[paChequearBajasDeServicios] TO [GestionInstitucional]
GRANT EXECUTE ON  [dbo].[paChequearBajasDeServicios] TO [PersonalDocente]
GO
